﻿//********************************************************
//创建日期：<创建日期，2024-12-12>
//创建作者：<zhucong@shanghai3h.com>
//功能说明:  KeJiGuanDPBLL
//********************************************************
using Access.BLL;
using Entity;
using Newtonsoft.Json;
using Oracle.DataAccess.Client;
using Platform.Data;
using StoreProcedure;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Net.NetworkInformation;
using System.Security.Policy;
using System.Text;
using System.Web;
using YiWangTongBan.Entity.dto;

namespace YiWangTongBan.BLL
{
    public class KeJiGuanDPBLL
    {

        string s_suffix_notEmpty = string.Format(" {0}", "不能为空");
        BusinessLogsticBase _BusinessLogsticBase = new BusinessLogsticBase();
        AccessDataBase _AccessDataBase = new AccessDataBase();
        DLLYWTB_WS _DLLYWTB_WS = new DLLYWTB_WS();

        public static string CompanyCode = "PDXQZLS";

        /// <summary>
        /// 科技馆大屏
        /// </summary>
        /// <param name="keJiGuanDPInput"></param>
        public XiangYingEntity KeJiGuanDPBL(KeJiGuanDPInput keJiGuanDPInput)
        {
            XiangYingEntity xiangYingEntity = new XiangYingEntity();
            xiangYingEntity.isSuccess = true;
            xiangYingEntity.code = 200;
            int i_code = 200;
            string s_result = "";
            StringBuilder s_message = new StringBuilder();
            try
            {
                var url = HttpContext.Current.Request.Url.ToString();
                var jsonParam = JsonConvert.SerializeObject(keJiGuanDPInput);
                LogUtil.Info(string.Format("请求地址：{0},请求参数：{1}", url, jsonParam));
                xiangYingEntity.incident_id = keJiGuanDPInput.incidentId;

                #region 验证参数
                if (!yanzcs(keJiGuanDPInput.incidentId, "申请单id", xiangYingEntity))
                    return xiangYingEntity;
                if (!yanzcs(keJiGuanDPInput.applyNo, "办件编号", xiangYingEntity))
                    return xiangYingEntity;
                if (!yanzcs(keJiGuanDPInput.businessType, "业务类型", xiangYingEntity))
                    return xiangYingEntity;
                #endregion
                #region 验证该INCIDENT_ID记录是否已存在
                //var b_isGood = _BusinessLogsticBase.IsIncident_IDExist(keJiGuanDPInput.incidentId);
                var _obj = OracleHelper.ExecuteScalar(Platform.Configuration.ConfigHelper.BusinessConnString, CommandType.Text, string.Format("select 1 from WTB_KEJIGUANDP where INCIDENT_ID='{0}'", Platform.Common.Utility.SafeSQL(keJiGuanDPInput.incidentId)));
                var b_isGood = _obj == null;
                if (!b_isGood)
                {
                    s_result = string.Format("申请单号:{0}已存在", keJiGuanDPInput.incidentId);
                    LogUtil.Info(s_result);

                    xiangYingEntity = _BusinessLogsticBase.GetXiangYingResult(9, s_result);
                    return xiangYingEntity;
                }
                #endregion

                banjiangetInput input = new banjiangetInput()
                {
                    incidentId = keJiGuanDPInput.incidentId,
                    applyNo = keJiGuanDPInput.applyNo,
                    businessType = keJiGuanDPInput.businessType,
                    companyCode = CompanyCode
                };

                string canshu = JsonConvert.SerializeObject(input);
                var token = GetTokenx();
                //获取办件详细信息
                string bjUrl = GetConfigStr("banjianget");

                LogUtil.Info($"bjUrl： '{bjUrl}' +  canshu： {canshu}");

                HttpResult httpdata = new HttpResult(); 


                LogUtil.Info(string.Format("请求地址：{0},请求参数：{1},返回结果：{2}, callresult:{3}", bjUrl, canshu, httpdata.html, httpdata.result));

#if DEBUG


                httpdata = new HttpResult()
                {
                    result = true,
                    html = @"{""success"":true,""code"":200,""msg"":"""",""data"":{""incidentId"":""35e7f28b-48b1-4702-8784-84aafcbea69a"",""applyNo"":""GA4432412310011"",""id"":""93"",""applicant"":""尹"",""mobile"":""13955138072"",""address"":""合庆社区卫生服务中心蔡路分中心"",""content"":""建议10"",""company"":""PDXQZLS"",""appdate"":""2024-12-31 13:22:45"",""reserve1"":null,""reserve2"":null,""reserve3"":null,""businessType"":""McsItemType.MuseumScreen""}}"
                };

#else

                httpdata = _DLLYWTB_WS.PostHttpNewWeb(bjUrl, canshu, token);
#endif


                var resultOutData = JsonConvert.DeserializeObject<ResultOutDataEntity<WKF_KeJiGuanDPOutput>>(httpdata.html);
                if (!resultOutData.success)
                {
                    i_code = resultOutData.code;
                    s_result = string.Format("申请单号:{0} 获取科技馆数据失败，{1}", input.incidentId, resultOutData.msg);
                    xiangYingEntity = _BusinessLogsticBase.GetXiangYingResult(i_code, s_result);
                    return xiangYingEntity;
                }
                var wKF_KeJiGuanDPOutput = resultOutData.data;

                if (!DPDataBC(input, wKF_KeJiGuanDPOutput))
                {
                    i_code = 12;
                    s_result = string.Format("申请单号:{0} 保存失败", input.incidentId);
                    xiangYingEntity = _BusinessLogsticBase.GetXiangYingResult(i_code, s_result);
                    return xiangYingEntity;
                }
                s_result = string.Format("申请单号:{0} 新增成功", input.incidentId);
                xiangYingEntity = _BusinessLogsticBase.GetXiangYingResult(i_code, s_result);
            }
            catch (Exception ex)
            {
                var strMsg = string.Format("申请单号：{0} 操作出现异常", keJiGuanDPInput.incidentId);
                xiangYingEntity = _BusinessLogsticBase.GetXiangYingResult(12, strMsg);

                var strLog = string.Format("申请单号：{0}操作失败,错误：{1}", keJiGuanDPInput.incidentId, ex);
                LogUtil.Info(strLog);
            }
            finally
            {
                LogUtil.Info(string.Format("科技馆大屏办理返回：{0}", JsonConvert.SerializeObject(xiangYingEntity)));
            }
            return xiangYingEntity;
        }

        /// <summary>
        /// 科技馆大屏返回
        /// </summary>
        /// <param name="leixing"></param>
        /// <param name="body"></param>
        /// <returns></returns>
        public IncidentStatusReturnEntity KeJiGuanDPSH(string body)
        {
            IncidentStatusReturnEntity result = new IncidentStatusReturnEntity();
            result.isSuccess = "true";
            result.code = "200";

            StringBuilder s_message = new StringBuilder();

            try
            {
                var url = HttpContext.Current.Request.Url.ToString();
                LogUtil.Info(string.Format("请求地址：{0},请求参数：{1}", url, body));
                //测试使用
                //body = "{\"incidentId\":\"949e55f6-617a-4856-9de9-2a9eaac23187202412061338\",\"responseTime\":\"2024-12-13 14:21:30\",\"suggestionContent\":\"建议内容测试\"}";
                KeJIGuanDPSHDto dPSHDto = JsonConvert.DeserializeObject<KeJIGuanDPSHDto>(body);
                if (dPSHDto == null)
                {
                    result.isSuccess = "false";
                    result.code = "500";
                    result.message = string.Format("KeJiGuanDPSH 输入参数反序列化错误：{0}", body);
                    return result;
                }

                WKF_KeJiGuanDPSHInput input = new WKF_KeJiGuanDPSHInput
                {
                    incidentId = dPSHDto.incidentId,
                    companyCode = CompanyCode,
                    suggestionContent = dPSHDto.suggestionContent,
                    responseTime = dPSHDto.responseTime,
                };

                string canshu = JsonConvert.SerializeObject(input);
                var token = GetTokenx();
                //获取办件详细信息
                string shUrl = GetConfigStr("KeJiGDPSH");
                HttpResult httpdata = _DLLYWTB_WS.PostHttpNewWeb(shUrl, canshu, token);
                LogUtil.Info(string.Format("请求地址：{0},请求参数：{1},返回结果：{2}, callresult:{3}", shUrl, canshu, httpdata.html, httpdata.result));
                var resultOutData = JsonConvert.DeserializeObject<ResultOutDataEntity<string>>(httpdata.html);
                if (resultOutData.code != 200 && resultOutData.code != 1003)
                {
                    result.isSuccess = "false";
                    result.code = "500";
                    result.message = "科技馆大屏返回内容反序列化错误";
                    return result;
                }

                DataSet ds = _AccessDataBase.GetParamsDataSource("<PROCEDURE>",
                    "UPDATE;WTB_KEJIGUANDPHT;"
                    + dPSHDto.incidentId + ";"
                    + dPSHDto.responseTime + ";"
                    + dPSHDto.suggestionContent + ";"
                    + dPSHDto.HuiTianR + ";"
                    , "");

                if (ds.Tables[0].Rows[0]["CODE"].ToString() != "0")
                {
                    result.isSuccess = "false";
                    result.code = "500";
                    result.message = string.Format("科技馆回复错误：{0}", ds.Tables[0].Rows[0]["MSG"].ToString());
                    return result;
                }
            }
            catch (Exception ex)
            {
                result.isSuccess = "false";
                result.code = "500";
                result.message = string.Format("错误:{0}", ex.Message);
            }
            finally
            {
                LogUtil.Info(string.Format("科技馆大屏审核返回：{0}", JsonConvert.SerializeObject(result)));
            }
            return result;
        }

        private bool DPDataBC(banjiangetInput input, WKF_KeJiGuanDPOutput wKF_KeJiGuanDPOutput)
        {
            bool fret = true;
            var account = "一网通办";
            fret = InvokeOracleTransaction(account, (OracleTransaction tran) =>
            {

                var kidObj = OracleHelper.ExecuteScalar(tran, CommandType.Text, "SELECT  KID_sequence.Nextval KID FROM  DUAL");
                int i_kid = Convert.ToInt32(kidObj);

                string strNow = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                //新增工单信息

                GDPT_KEJIGUANDPTSParameter kEJIGUANDPTSParameter = new GDPT_KEJIGUANDPTSParameter();
                kEJIGUANDPTSParameter.D_JIEBAOSJ = strNow;
                kEJIGUANDPTSParameter.S_FANYINGR = wKF_KeJiGuanDPOutput.applicant;//反映人
                kEJIGUANDPTSParameter.S_LIANXIDH = wKF_KeJiGuanDPOutput.mobile;
                kEJIGUANDPTSParameter.S_YHH = "";
                kEJIGUANDPTSParameter.S_DZ = wKF_KeJiGuanDPOutput.address;
                kEJIGUANDPTSParameter.S_LIANXISJ = strNow;
                kEJIGUANDPTSParameter.S_FANYINGLY = "科技馆人民建议";
                kEJIGUANDPTSParameter.S_FANYINGLB = "建议";
                kEJIGUANDPTSParameter.S_FANYINGNR = "科技馆人民建议";
                kEJIGUANDPTSParameter.S_CHULIJB = "3天";
                kEJIGUANDPTSParameter.S_BEIZHU = "一网通办新增";
                kEJIGUANDPTSParameter.V_USERNAME = account;
                kEJIGUANDPTSParameter.I_KID = i_kid;

                var dsGDXX = GDPT_KEJIGUANDPTS(kEJIGUANDPTSParameter, tran);
                LogUtil.Info("KJG GDPT_KEJIGUANDPTS");
                if (dsGDXX.Tables[0].Rows.Count == 0 || dsGDXX.Tables[0].Rows[0][0].ToString() == "新增失败")
                    return false;

                string gongdanbh = dsGDXX.Tables[0].Rows[0][0].ToString();

                WTB_KEJIGUANDP wTB_KEJIGUANDP = new WTB_KEJIGUANDP();
                wTB_KEJIGUANDP.ID = 0;
                wTB_KEJIGUANDP.INCIDENT_ID = input.incidentId;
                wTB_KEJIGUANDP.INCIDENT_TYPE = "McsItemType.MuseumScreen";
                wTB_KEJIGUANDP.BUSINESSTYPE = "50";//业务类型
                wTB_KEJIGUANDP.APPLYNO = wKF_KeJiGuanDPOutput.applyNo;
                wTB_KEJIGUANDP.DP_ID = wKF_KeJiGuanDPOutput.id;
                wTB_KEJIGUANDP.APPLICANT = wKF_KeJiGuanDPOutput.applicant;
                wTB_KEJIGUANDP.MOBILE = wKF_KeJiGuanDPOutput.mobile;
                wTB_KEJIGUANDP.ADDRESS = wKF_KeJiGuanDPOutput.address;
                wTB_KEJIGUANDP.CONTENT = wKF_KeJiGuanDPOutput.content;
                wTB_KEJIGUANDP.COMPANY = wKF_KeJiGuanDPOutput.company;
                wTB_KEJIGUANDP.APPDATE = wKF_KeJiGuanDPOutput.appdate;
                wTB_KEJIGUANDP.RESERVE1 = wKF_KeJiGuanDPOutput.reserve1;
                wTB_KEJIGUANDP.RESERVE2 = wKF_KeJiGuanDPOutput.reserve2;
                wTB_KEJIGUANDP.RESERVE3 = wKF_KeJiGuanDPOutput.reserve3;
                wTB_KEJIGUANDP.S_GONGDANBH = gongdanbh;

                USP_INS_WTB_KEJIGUANDP(wTB_KEJIGUANDP, tran);
                LogUtil.Info("KJG USP_INS_WTB_KEJIGUANDP");
                if (wTB_KEJIGUANDP.ID == 0)
                    return false;

                return true;

            });
            return fret;
        }




        public bool yanzcs(string val, string csm, XiangYingEntity ret)
        {
            if (string.IsNullOrEmpty(val))
            {
                ret.message = csm + s_suffix_notEmpty;
                ret.errCode = "11";
                ret.code = 500;
                ret.isSuccess = false;
                return false;
            }
            return true;
        }


        public string GetTokenx()
        {
            //获取token
            var vcompany = ConfigurationManager.AppSettings["HT_companyCode"];
            var vusername = ConfigurationManager.AppSettings["HT_userId"];
            var vpassword = ConfigurationManager.AppSettings["HT_password"];

            BusinessLogsticBase bl = new BusinessLogsticBase();
            string token = bl.GetToken(vcompany, vusername, vpassword);

            if (string.IsNullOrEmpty(token))
            {
                throw new Exception("token获取失败");
            }
            return token;
        }

        public string GetConfigStr(string keyname)
        {
            if (string.IsNullOrEmpty(keyname))
                return "";

            return ConfigurationManager.AppSettings[keyname];
        }

        /// <summary>
        /// 定义返回响应结果的方法
        /// </summary>
        /// <param name="require">RequireParaEntity对象</param>
        /// <param name="intCode">状态码</param>
        /// <param name="strMsg">返回消息</param>
        /// <param name="i_WsNo">接口名称</param>
        /// <returns>XiangYingEntity对象</returns>
        public static XiangYingEntity GetXiangYingResult(int intCode, string strMsg)
        {
            XiangYingEntity xyEntity = new XiangYingEntity();
            xyEntity.code = intCode;
            switch (intCode)
            {
                case 200:
                    xyEntity.isSuccess = true;
                    xyEntity.code = intCode;
                    xyEntity.message = strMsg;
                    break;
                default:
                    xyEntity.isSuccess = false;
                    xyEntity.code = 500;
                    xyEntity.errCode = intCode.ToString().PadLeft(2, '0');
                    xyEntity.message = strMsg;
                    break;
            }

            return xyEntity;
        }



        public static void CreateKEJIGUANEntity(out WTB_YEWUZB _WTB_YEWUZB, KeJiGuanDPInput keJiGuanDPInput, WKF_KeJiGuanDPOutput wKF_KeJiGuanDPOutput)
        {
            WTB_YEWUZB _outWTB_YEWUZB = new WTB_YEWUZB();
            //数据表基础信息赋值
            _outWTB_YEWUZB.ID = 0;
            _outWTB_YEWUZB.S_ZHUBIAOBH = keJiGuanDPInput.businessType + GetTimeStamp();//此处为incident_type+ GetTimeStamp(),暂时将实名制incident_type设定为17
            _outWTB_YEWUZB.D_JIESHOUSJ = DateTime.Now;
            _outWTB_YEWUZB.D_CAOZUOSJ = DateTime.Now;
            _outWTB_YEWUZB.I_ZHUANGTAI = 1;//处理中
            _outWTB_YEWUZB.IS_TRANSFER_ORDER = "";
            _outWTB_YEWUZB.SHW_COMPANY_SOURCE = "";
            //
            _outWTB_YEWUZB.INCIDENT_ID = keJiGuanDPInput.incidentId;
            _outWTB_YEWUZB.APPLY_NO = keJiGuanDPInput.applyNo;
            _outWTB_YEWUZB.APPLICANT = wKF_KeJiGuanDPOutput.applicant;
            _outWTB_YEWUZB.APPDATE = wKF_KeJiGuanDPOutput.appdate.ToString("yyyy-MM-dd HH:mm:ss");
            _outWTB_YEWUZB.INCIDENT_TYPE = "McsItemType.MuseumScreen";
            _outWTB_YEWUZB.ADDRESS = wKF_KeJiGuanDPOutput.address;
            _outWTB_YEWUZB.BUSINESS_TYPE = wKF_KeJiGuanDPOutput.businessType;
            _outWTB_YEWUZB.CUSTOM_TYPE = "02";
            _outWTB_YEWUZB.CARD_ID = "";
            _outWTB_YEWUZB.EMAIL = "";
            _outWTB_YEWUZB.COMPANY_NAME = "";

            _WTB_YEWUZB = _outWTB_YEWUZB;
        }

        /// <summary>
        /// 获取时间戳
        /// </summary>
        /// <returns></returns>
        public static string GetTimeStamp()
        {
            TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds).ToString();
        }



        public static bool InvokeOracleTransaction(string account, Func<OracleTransaction, bool> func)
        {
            bool result = false;
            using (OracleConnection conn = new OracleConnection(Platform.Configuration.ConfigHelper.BusinessConnString))
            {
                conn.Open();
                OracleTransaction tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    result = func(tran);
                    if (result)
                    {
                        tran.Commit();
                    }
                    else
                    {
                        tran.Rollback();
                    }
                }
                catch (Exception ex)
                {

                    //SYS_ERRORLOGBLL err = new SYS_ERRORLOGBLL();
                    //err.SaveLogInfo(ex.ToString(), ex.GetType().ToString(), account);
                    tran.Rollback();
                    throw ex;
                    return false;
                }
            }
            return result;
        }




        private int USP_INS_WTB_KEJIGUANDP(WTB_KEJIGUANDP entity, OracleTransaction Transaction)
        {
            string spName = "USP_INS_WTB_KEJIGUANDP";
            OracleParameter[] storedParams = OracleHelperParameterCache.GetSpParameterSet(Platform.Configuration.ConfigHelper.BusinessConnString, spName);
            storedParams[0].Value = entity.ID;
            storedParams[1].Value = entity.S_ZHUBIAOBH;
            storedParams[2].Value = entity.INCIDENT_ID;
            storedParams[3].Value = entity.INCIDENT_TYPE;
            storedParams[4].Value = entity.BUSINESSTYPE;
            storedParams[5].Value = entity.APPLYNO;
            storedParams[6].Value = entity.DP_ID;
            storedParams[7].Value = entity.APPLICANT;
            storedParams[8].Value = entity.MOBILE;
            storedParams[9].Value = entity.ADDRESS;
            storedParams[10].Value = entity.CONTENT;
            storedParams[11].Value = entity.COMPANY;
            storedParams[12].Value = entity.APPDATE;
            storedParams[13].Value = entity.D_JIESHOUSJ;
            storedParams[14].Value = entity.S_HUITIANR;
            storedParams[15].Value = entity.D_HUITIANSJ;
            storedParams[16].Value = entity.S_JIANYINR;
            storedParams[17].Value = entity.S_GONGDANBH;
            storedParams[18].Value = entity.RESERVE1;
            storedParams[19].Value = entity.RESERVE2;
            storedParams[20].Value = entity.RESERVE3;

            int result = 0;
            if (Transaction == null)
                result = OracleHelper.ExecuteNonQuery(Platform.Configuration.ConfigHelper.BusinessConnString, CommandType.StoredProcedure, spName, storedParams);
            else
                result = OracleHelper.ExecuteNonQuery((OracleTransaction)Transaction, CommandType.StoredProcedure, spName, storedParams);
            // entity.ID = Convert.ToInt32(storedParams[0].Value);
            return result;
        }

        public static DataSet GDPT_KEJIGUANDPTS(GDPT_KEJIGUANDPTSParameter spParameter, OracleTransaction trans)
        {
            string spName = "GDPT_KEJIGUANDPTS";
            OracleParameter[] storedParams;
            storedParams = OracleHelperParameterCache.GetSpParameterSet(Platform.Configuration.ConfigHelper.BusinessConnString, spName);
            storedParams[0].Value = spParameter.D_JIEBAOSJ;
            storedParams[1].Value = spParameter.S_FANYINGR;
            storedParams[2].Value = spParameter.S_LIANXIDH;
            storedParams[3].Value = spParameter.S_YHH;
            storedParams[4].Value = spParameter.S_DZ;
            storedParams[5].Value = spParameter.S_LIANXISJ;
            storedParams[6].Value = spParameter.S_FANYINGLY;
            storedParams[7].Value = spParameter.S_FANYINGLB;
            storedParams[8].Value = spParameter.S_FANYINGNR;
            storedParams[9].Value = spParameter.S_CHULIJB;
            storedParams[10].Value = spParameter.S_BEIZHU;
            storedParams[11].Value = spParameter.V_USERNAME;
            storedParams[12].Value = spParameter.I_KID;
            DataSet ds = new DataSet();
            if (trans == null)
                ds = OracleHelper.ExecuteDataset(Platform.Configuration.ConfigHelper.BusinessConnString, CommandType.StoredProcedure, spName, storedParams);
            else
            {
                ds = OracleHelper.ExecuteDataset(trans, CommandType.StoredProcedure, spName, storedParams);
            }

            return ds;

        }

        public static DataSet INS_GONGDANXX(INS_GONGDANXXParameter spParameter, OracleTransaction trans)
        {
            string spName = "INS_GONGDANXX";
            OracleParameter[] storedParams;
            storedParams = OracleHelperParameterCache.GetSpParameterSet(Platform.Configuration.ConfigHelper.BusinessConnString, spName);
            storedParams[0].Value = spParameter.D_JIEBAOSJ;
            storedParams[1].Value = spParameter.S_FANYINGR;
            storedParams[2].Value = spParameter.S_LIANXIDH;
            storedParams[3].Value = spParameter.S_YHH;
            storedParams[4].Value = spParameter.S_DZ;
            storedParams[5].Value = spParameter.S_LIANXISJ;
            storedParams[6].Value = spParameter.S_FANYINGLY;
            storedParams[7].Value = spParameter.S_FANYINGLB;
            storedParams[8].Value = spParameter.S_FANYINGNR;
            storedParams[9].Value = spParameter.S_CHULIJB;
            storedParams[10].Value = spParameter.S_BEIZHU;
            storedParams[11].Value = spParameter.V_USERNAME;
            storedParams[12].Value = spParameter.I_KID;
            DataSet ds = new DataSet();
            if (trans == null)
                ds = OracleHelper.ExecuteDataset(Platform.Configuration.ConfigHelper.BusinessConnString, CommandType.StoredProcedure, spName, storedParams);
            else
            {
                ds = OracleHelper.ExecuteDataset(trans, CommandType.StoredProcedure, spName, storedParams);
            }

            return ds;

        }

        public class KeJIGuanDPSHDto
        {
            /// <summary>
            /// 申请单唯一ID
            /// </summary>
            public string incidentId { get; set; }

            /// <summary>
            /// 反馈时间
            /// </summary>
            public string responseTime { get; set; }

            /// <summary>
            /// 建议内容
            /// </summary>
            public string suggestionContent { get; set; }

            /// <summary>
            /// 公司编号
            /// </summary>
            public string companyCode { get; set; }

            public string HuiTianR { get; set; }
        }

        public class KeJiGuanDPBLRespDto
        {
            /// <summary>
            /// 申请单唯一ID
            /// </summary>
            public string incidentId { get; set; }

            public bool success { get; set; }

            public int code { get; set; }
        }
    }
}